package algorithm;

import org.junit.Test;

/**
 * 给定一个数组，它的第 i 个元素是一支给定股票第 i 天的价格。

    如果你最多只允许完成一笔交易（即买入和卖出一支股票），设计一个算法来计算你所能获取的最大利润。
    
    注意你不能在买入股票前卖出股票。
    
    示例 1:
    
    输入: [7,1,5,3,6,4]
    输出: 5
    解释: 在第 2 天（股票价格 = 1）的时候买入，在第 5 天（股票价格 = 6）的时候卖出，最大利润 = 6-1 = 5 。
         注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
    示例 2:
    
    输入: [7,6,4,3,1]
    输出: 0
    解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
    
    来源：力扣（LeetCode）
    链接：https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock
    著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * @author prd-fuy
 * @version $Id: MaxProfit.java, v 0.1 2019年11月1日 上午10:42:42 prd-fuy Exp $
 */
public class MaxProfit {
    
    public int maxProfit(int[] prices) {
        int maxProfit = 0;
        for (int i = 0; i < prices.length; i++) {
            int profit = 0;
            for (int j = i; j < prices.length; j++) {
                int curProfit = prices[j] - prices[i];
                if (curProfit > profit)
                    profit = curProfit;
            }
            if (profit > maxProfit)
                maxProfit = profit;
        }
        return maxProfit;
    }
    
    public int maxProfit2(int[] prices) {
        int maxPrices = 0, minPrices = 0, maxPos = 0, minPos = 0;
        boolean flag = true;
        while (true) {
            for (int i = 0; i < prices.length; i++) {
                if (prices[i] > maxPrices) {
                    maxPrices = prices[i];
                    maxPos = i;
                } else if (prices[i] < minPrices) {
                    minPrices = prices[i];
                    minPos = i;
                }
            }
            if (maxPos > minPos)
                return maxPrices - minPrices;
        }
    }
    
    @Test
    public void test1() {
        int[] arr = { 7, 1, 5, 3, 6, 4 };
        System.out.println(maxProfit(arr));
    }
    
    @Test
    public void test2() {
        int[] arr = { 7, 6, 4, 3, 1 };
        System.out.println(maxProfit(arr));
    }
    
    @Test
    public void test3() {
        int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        System.out.println(maxProfit(arr));
    }
    
    @Test
    public void test4() {
        int[] arr = { 7, 6, 5, 9, 2, 8, 3, 1, 4 };
        System.out.println(maxProfit(arr));
    }
    
    @Test
    public void test5() {
        int[] arr = { 2, 9, 6, 5, 7, 3, 1, 4 };
        System.out.println(maxProfit(arr));
    }
}
